package com.dong.mcd.util;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
import net.sf.json.util.CycleDetectionStrategy;

import com.dong.mcd.pub.Constants;

public class JSONUtil {

	/**
	 * 将对像转换成json字符串
	 * 
	 * @param bean
	 *            待转化的对象
	 * @param excludeProperties
	 *            转化过程中序号排除掉的属性名称
	 * @return
	 * @throws Exception
	 */
	public static String beanToJsonEx(Object bean,
			String[] excludeProperties) throws Exception {
		JsonConfig cfg = new JsonConfig();
		cfg.setExcludes(excludeProperties);
		cfg.setIgnoreDefaultExcludes(false);
		cfg.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);

		cfg.registerJsonValueProcessor(Date.class, new JsonValueProcessor() {

			public Object processObjectValue(String arg0, Object arg1,
					JsonConfig arg2) {
				// TODO Auto-generated method stub
				SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
						"yyyy-MM-dd HH:mm:ss");
				Date d1 = (Date) arg1;
				return simpleDateFormat.format(d1);
			}

			public Object processArrayValue(Object arg0, JsonConfig arg1) {
				// TODO Auto-generated method stub
				return null;
			}
		});
		return JSONObject.fromObject(bean, cfg).toString();
	}
	
	/**
	 * 返回集合的json信息，放在这里主要是避免产生json字符串时出现环路
	 * 
	 * @param list
	 * @param excludeProperties
	 *            转化过程中序号排除掉的属性名称，对应于List所放对象中的属性
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static String listToJsonEx(List list, String[] excludeProperties) {
		JsonConfig cfg = new JsonConfig();
		cfg.setExcludes(excludeProperties);
		cfg.setIgnoreDefaultExcludes(false);
		// 防止出现环路
		cfg.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);

		// 对日期进行序列化控制
		cfg.registerJsonValueProcessor(Date.class, new JsonValueProcessor() {

			public Object processObjectValue(String arg0, Object arg1,
					JsonConfig arg2) {
				// TODO Auto-generated method stub
				SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
						"yyyy-MM-dd HH:mm:ss");
				Date d1 = (Date) arg1;
				return simpleDateFormat.format(d1);
			}

			public Object processArrayValue(Object arg0, JsonConfig arg1) {
				// TODO Auto-generated method stub
				return null;
			}
		});

		return JSONArray.fromObject(list, cfg).toString();
	}
	
	/**
	 * 对象转json字符串，通用
	 * @param obj  对象
	 * @return
	 */
	public static String toJson(Object obj) {
		// json配置
		JsonConfig jsonConfig = new JsonConfig();
		// 设置javabean中日期转换时的格式
		jsonConfig.registerJsonValueProcessor(Date.class,
				new JsonDateValueProcessor(Constants.Date.LONG_DATE_PATTERN));
		jsonConfig.registerJsonValueProcessor(Timestamp.class,
				new JsonDateValueProcessor(Constants.Date.LONG_DATE_PATTERN));
		JSONObject jsonObject = JSONObject.fromObject(obj, jsonConfig);
		return jsonObject.toString();
	}
	
	/**
	 * 集合对象转json字符串
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public static String arrayToJson(Object obj){
		// json配置
		JsonConfig jsonConfig = new JsonConfig();
		// 设置javabean中日期转换时的格式
		jsonConfig.registerJsonValueProcessor(Date.class,
				new JsonDateValueProcessor(Constants.Date.LONG_DATE_PATTERN));

		JSONArray jsonObject = JSONArray.fromObject(obj, jsonConfig);
		return jsonObject.toString();
	}
	
	public static <T> T toObject(String json,Class<T> cls){
		// json配置
		JsonConfig jsonConfig = new JsonConfig();
		// 设置javabean中日期转换时的格式
		jsonConfig.registerJsonValueProcessor(Date.class,
				new JsonDateValueProcessor(Constants.Date.LONG_DATE_PATTERN));
		jsonConfig.registerJsonValueProcessor(Timestamp.class,
				new JsonDateValueProcessor(Constants.Date.LONG_DATE_PATTERN));
		JSONObject jsonObject = JSONObject.fromObject(json, jsonConfig);
		return (T) JSONObject.toBean(jsonObject,cls);
	}
	
	public static <T> List<T> toList(String json,Class<T> cls){
		// json配置
		JsonConfig jsonConfig = new JsonConfig();
		// 设置javabean中日期转换时的格式
		jsonConfig.registerJsonValueProcessor(Date.class,
				new JsonDateValueProcessor(Constants.Date.LONG_DATE_PATTERN));
		jsonConfig.registerJsonValueProcessor(Timestamp.class,
				new JsonDateValueProcessor(Constants.Date.LONG_DATE_PATTERN));
		JSONArray jsonObject = JSONArray.fromObject(json, jsonConfig);
		return (List<T>) JSONArray.toArray(jsonObject,cls);
	}
}
